from flask import current_app, jsonify
from flask import render_template
from flask import request
from flask import session

from info import constants
from info.models import User, News, Category
from info.utlis.response_code import RET
from . import index_blu
from info import redis_store


#自定义网站图标的路由
@index_blu.route('/favicon.ico')
def favicon():
    return current_app.send_static_file('news/favicon.ico')

@index_blu.route('/')
def index():

    #判断用户是否登陆 取出session中保存的id
    user_id =session.get('user_id',None)
    user = None#这一步是为了没进入下面判断准备
    # 的，如果用户没有登陆请求首页 不会有session也就是说user_id = None
    #进入不了判断  在data 但是字典那一步还需要user这个对象 所有需要bauser设置一个控值
    #判断取到的id
    if user_id:
        try:
            #获取此user_id的user对象
            user =  User.query.get(user_id)
        except Exception as e:
            current_app.logger.error(e)

#############################################################################################################################

    #右侧的新闻排行的逻辑
    news_list = []
    #查询出所有新闻信息用过浏览量降序降序排列 取前六个
    # 查询出来的是news模型对象，通过列表保存
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
    #定义空的字典列表
    news_dict_li = []
    #便利对象列表 把对象的字典添加字典列表中
    #news.to_basic_dict() 是新闻对象查询出对应 数据
    for news in news_list:
        news_dict_li.append(news.to_basic_dict())


    #查询分类的数据，通过模版渲染出来
    categories = Category.query.all()
    categoriy_li = []
    #循环遍历取出分类的对象
    for category in categories:
        categoriy_li.append(category.to_dict())

    # #查询出数据 通过浏览量降序排列 取出前六个
    # #创建列表保存查询出来的新闻模型对象
    # news_list = []
    # try:
    #     news_list = News.query.order_by(News.chicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    # except Exception as e:
    #     return jsonify(errno=RET.PARAMERR, errmsg='查询失败')
    # #定义字典列表
    # news_dict_li = []
    # #遍历列表的模型对象 取出对象身上的所有属性 字典对象的方式保存到列表中
    # for news in news_list:
    #     news_dict_li.append(news.to_basic_dict())
    # #查询分类的数据返回
    #

    #查询用户的所有信息保存在字典
    data = {
        "user":user.to_dict() if user else None,#三元表达式 如user不为空 执行user.todict 否则返回为None
        "news_dict_li":news_dict_li,
        "category_li":categoriy_li
    }

    return render_template('news/index.html',data=data)
############################################################################################################################

#创建访问首页数据的路由
@index_blu.route('/news_list')
def news_list():
    #获取参数
    cid = request.args.get("cid","1")#分类
    page = request.args.get("page","1")#页数
    per_page = request.args.get('per_page','10')#每页多少数据
    #校验参数
    try:
        page =int(page)
        cid =int(cid)
        per_page =int(per_page)
    except Exception as e :
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="参数格式错误")
    #审核通过的条件
    filters = [News.status == 0]
    if cid != 1:
        #需要添加条件
        filters.append(News.category_id == cid)
    #查询数据
    try:
        #create_time 创建时间
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,per_page,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="新闻数据查询错误")

    # news_model_list 列表里装的是模型对象
    # 获取当前页面的数据
    news_model_list = paginate.items
    # 获取总页数
    total_page = paginate.pages
    # 获取当前页数
    current_page =paginate.page

    #讲模型对象列表 转换成字典列表
    news_dict_li = []
    for news in news_model_list:
        news_dict_li.append(news.to_basic_dict())

    data ={
        "total_page" : total_page,
        "current_page" : current_page,
        "news_dict_li" : news_dict_li
    }

    return jsonify(errno=RET.OK, errmsg="ok",data=data)
